package org.apli.haiam.admin.jsf.managed;

import com.apli.controladores.AplinfoFactoryBean;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.CexAgenda;
import org.apli.haiam.ejb.entidades.CexConsultaTerapia;
import org.apli.haiam.ejb.entidades.CexTerapiaUsuario;
import org.apli.haiam.ejb.entidades.CexTipoTerapia;
import org.apli.haiam.ejb.interfaces.AdministradorHaiam;
import org.apli.haiam.ejb.interfaces.ConsExternaAdministrador;
import org.apli.jsf.managed.JsfBean;
import org.primefaces.event.RowEditEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad CexConsultaTerapia.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/03/2015
 */
@ManagedBean
@ViewScoped
public class JsfEjercicioTerapia extends JsfBean<CexConsultaTerapia> {

    final Logger log = LoggerFactory.getLogger(JsfEjercicioTerapia.class);
    private CexTipoTerapia cexTipoTerapia;
    private ConsExternaAdministrador hcAdmin;
    private boolean ondaCorta;
    private boolean ultrasonido;
    private boolean magnetoterapia;
    private boolean laser;
    private boolean electrodos;
    private boolean compresaCaliente;
    private boolean compresaFria;
    private boolean tanques;
    private boolean masoterapia;
    private boolean reduccionPostural;
    private boolean kinesioTerapia;
    private boolean mecanoTerapia;
    private boolean entrenamientoPre;
    private boolean entrenamientoPost;
    private boolean gimnasio;
    private boolean otros;
    private Date fecha;
    private UsuarioAdmin user;
    private CexTerapiaUsuario cexTerapiaUsuario;
    private static final String TIPO_IMPRESORAS = "IMP_TMU220D";
    private static final String NAME_REPORTE = "RPT_TURNO.jasper";
    private static final String TIPO_REPORTE_PDF = "application/pdf";
    private static final String TIPO_REPORTE_EXC = "application/vnd.ms-excel";

    // private AdmSistema sistemaSeleccionado;
    /**
     * Constructor por defecto.
     */
    public JsfEjercicioTerapia() {
        // sistemaSeleccionado = new AdmSistema();
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        object = new CexConsultaTerapia();
        ondaCorta = false;
        ultrasonido = false;
        magnetoterapia = false;
        laser = false;
        electrodos = false;
        compresaCaliente = false;
        compresaFria = false;
        tanques = false;
        masoterapia = false;
        reduccionPostural = false;
        kinesioTerapia = false;
        mecanoTerapia = false;
        entrenamientoPre = false;
        entrenamientoPost = false;
        gimnasio = false;
        otros = false;
        cexTerapiaUsuario = new CexTerapiaUsuario();
        user = (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user");
        try {
            fecha = admin.getFechaDb();
            cexTipoTerapia = (CexTipoTerapia) admin.buscar(CexTipoTerapia.class, "cttId", 6);
        } catch (Exception e) {
            log.error("inicializar() {} ", e.getMessage());
        }

    }

    /**
     * Iyección de dependencia para conectarse al EJB(Lógica de Negocio)
     * Iyección de dependencia para el sistema de Administarción. Iyección de
     * dependencia para el sistema de Emergencia.
     */
    @Override
    protected void cargarEjb() {
        //super.cargarEjb();
        if (hcAdmin == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.ConsExterna");
                ejbPath = ORBContext + ejbContextPath + "/ConsExternaAdministradorBean";
                hcAdmin = (ConsExternaAdministrador) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error("cargarEjb() {} - {} ", ejbPath, e.getMessage());
            }

        }
        if (admin == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorBeanHaiam";
                admin = (AdministradorHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error(" cargarEjb() {} - {} ", ejbPath, e.getMessage());
            }
        }
        if (adminObject == null) {
            String ejbPath = null;
            try {
                ResourceBundle property = getProperties();
                String ORBContext = property.getString("ORBContext");
                String ejbContextPath = property.getString("ejb.context.path.admin");
                ejbPath = ORBContext + ejbContextPath + "/AdministradorBeanHaiam";
                adminObject = (AdministradorHaiam) AplinfoFactoryBean.lookupBean(ejbPath, false);
            } catch (Exception e) {
                log.error(" cargarEjb() {} - {} ", ejbPath, e.getMessage());
            }
        }
    }

    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            lista = admin.listarOrdenada(object.getClass(), "cctFecha", fecha, "cexTipoTerapia", cexTipoTerapia, "cctEstado", 1, "cctHora", true);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();

        if (object.getCctId() != null) {
            try {

                //Reemplazo de valores 
                //Onda corta
                if (ondaCorta) {
                    object.setCctOndaCorta(1);
                } else {
                    object.setCctOndaCorta(0);
                }

                //Ultrasonido
                if (ultrasonido) {
                    object.setCctUltrasonido(1);
                } else {
                    object.setCctUltrasonido(0);
                }

                //magnetoterapia
                if (magnetoterapia) {
                    object.setCctMagnetoterapia(1);
                } else {
                    object.setCctMagnetoterapia(0);
                }

                //Laser
                if (laser) {
                    object.setCctLaser(1);
                } else {
                    object.setCctLaser(0);
                }

                //Electrodos
                if (electrodos) {
                    object.setCctElectrodos(1);
                } else {
                    object.setCctElectrodos(0);
                }

                //Compresa caliente
                if (compresaCaliente) {
                    object.setCctCompresaQuimicaCaliente(1);
                } else {
                    object.setCctCompresaQuimicaCaliente(0);
                }

                //Compresa fria
                if (compresaFria) {
                    object.setCctCompresaQuimicaFria(1);
                } else {
                    object.setCctCompresaQuimicaFria(0);
                }

                //Tanques
                if (tanques) {
                    object.setCctTanques(1);
                } else {
                    object.setCctTanques(0);
                }

                //Masoterapia
                if (masoterapia) {
                    object.setCctMasoterapia(1);
                } else {
                    object.setCctMasoterapia(0);
                }

                //Reduccion postural
                if (reduccionPostural) {
                    object.setCctReeducacionPostural(1);
                } else {
                    object.setCctReeducacionPostural(0);
                }

                //Kinesio terapia
                if (kinesioTerapia) {
                    object.setCctKinesioTerapia(1);
                } else {
                    object.setCctKinesioTerapia(0);
                }

                //Mecanoterapia
                if (mecanoTerapia) {
                    object.setCctMecanoterapia(1);
                } else {
                    object.setCctMecanoterapia(0);
                }

                //Entrenamiento pre
                if (entrenamientoPre) {
                    object.setCctEntrenamientoPre(1);
                } else {
                    object.setCctEntrenamientoPre(0);
                }

                //Entrenamiento post
                if (entrenamientoPost) {
                    object.setCctEntrenamientoPos(1);
                } else {
                    object.setCctEntrenamientoPos(0);
                }

                //Gimnasia
                if (gimnasio) {
                    object.setCctGimnasio(1);
                } else {
                    object.setCctGimnasio(0);
                }

                //Otras
                if (otros) {
                    object.setCctOtros(1);
                } else {
                    object.setCctOtros(0);
                }

                object.setCctHoraAtencion(admin.getFechaDb());
                hcAdmin.modificarTransaccion(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                //Agregar usuario a la tabla terapia-Usuario
                if (!hcAdmin.existePorCampo(CexTerapiaUsuario.class, "cexConsultaTerapia", object, "cexConsultaTerapia.cexTipoTerapia", object.getCexTipoTerapia(),
                        "cexConsultaTerapia.cctFecha", object.getCctFecha(), "ctuIdUsuario", user.getUser().getIdUsuario())) {
                    cexTerapiaUsuario.setCexConsultaTerapia(object);
                    cexTerapiaUsuario.setCtuIdUsuario(user.getUser().getIdUsuario().intValue());
                    cexTerapiaUsuario.setCtuNombreUsuario(user.getUser().getAdmEmpleado().getNombreFull());
                    admin.crear(cexTerapiaUsuario, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                }
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
                inicializar();
            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debe seleccionar un paciente", "Debe seleccionar un paciente"));
        }
        cargarLista();
        return null;
    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String culminarTerapia() {
        FacesContext context = FacesContext.getCurrentInstance();

        if (object.getCctId() != null) {
            try {

                object.setCctEstado(2);
                hcAdmin.modificarTransaccion(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
                inicializar();
            } catch (Exception e) {
                log.error("culminarTerapia() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Debe seleccionar un paciente", "Debe seleccionar un paciente"));
        }
        cargarLista();
        return null;
    }

    @Override
    public String editarAction(CexConsultaTerapia obj) {
        //inicializar();
        try {
            object = obj;
            //Reemplazo de valores 
            //Onda corta
            if (object.getCctOndaCorta().equals(1)) {
                ondaCorta = object.getCctOndaCorta().equals(1);
            } else {
                ondaCorta = false;
            }

            //Ultrasonido
            if (object.getCctUltrasonido().equals(1)) {
                ultrasonido = object.getCctUltrasonido().equals(1);
            } else {
                ultrasonido = false;
            }

            //magnetoterapia
            if (object.getCctMagnetoterapia().equals(1)) {
                magnetoterapia = object.getCctMagnetoterapia().equals(1);
            } else {
                magnetoterapia = false;
            }

            //Laser
            if (object.getCctLaser().equals(1)) {
                laser = object.getCctLaser().equals(1);
            } else {
                laser = false;
            }

            //Electrodos
            if (object.getCctElectrodos().equals(1)) {
                electrodos = object.getCctElectrodos().equals(1);
            } else {
                electrodos = false;
            }

            //Compresa caliente
            if (object.getCctCompresaQuimicaCaliente().equals(1)) {
                compresaCaliente = object.getCctCompresaQuimicaCaliente().equals(1);
            } else {
                compresaCaliente = false;
            }

            //Compresa fria
            if (object.getCctCompresaQuimicaFria().equals(1)) {
                compresaFria = object.getCctCompresaQuimicaFria().equals(1);
            } else {
                compresaFria = false;
            }

            //Tanques
            if (object.getCctTanques().equals(1)) {
                tanques = object.getCctTanques().equals(1);
            } else {
                tanques = false;
            }

            //Masoterapia
            if (object.getCctMasoterapia().equals(1)) {
                masoterapia = object.getCctMasoterapia().equals(1);
            } else {
                masoterapia = false;
            }

            //Reduccion postural
            if (object.getCctReeducacionPostural().equals(1)) {
                reduccionPostural = object.getCctReeducacionPostural().equals(1);
            } else {
                reduccionPostural = false;
            }

            //Kinesio terapia
            if (object.getCctKinesioTerapia().equals(1)) {
                kinesioTerapia = object.getCctKinesioTerapia().equals(1);
            } else {
                kinesioTerapia = false;
            }

            //Mecanoterapia
            if (object.getCctMecanoterapia().equals(1)) {
                mecanoTerapia = object.getCctMecanoterapia().equals(1);
            } else {
                mecanoTerapia = false;
            }

            //Entrenamiento pre
            if (object.getCctEntrenamientoPre().equals(1)) {
                entrenamientoPre = object.getCctEntrenamientoPre().equals(1);
            } else {
                entrenamientoPre = false;
            }

            //Entrenamiento post
            if (object.getCctEntrenamientoPos().equals(1)) {
                entrenamientoPost = object.getCctEntrenamientoPos().equals(1);
            } else {
                entrenamientoPost = false;
            }

            //Gimnasia
            if (object.getCctGimnasio().equals(1)) {
                gimnasio = object.getCctGimnasio().equals(1);
            } else {
                gimnasio = false;
            }

            //Otras
            if (object.getCctOtros().equals(1)) {
                otros = object.getCctOtros().equals(1);
            } else {
                otros = false;
            }

        } catch (Exception e) {
            log.error("editarAction() {} ", e.getMessage());
        }
        return null;
    }

    /**
     * Funcion que divide dos numero BigDecimales en el caso de que el resultado
     * sea mas extenso de lo que este puede abarcar en la expecion lo divide
     * como double
     *
     * @param A
     * @param B
     * @return BigDe
     */
    public static BigDecimal divisionControlada(BigDecimal A, BigDecimal B) {
        try {
            return A.divide(B);
        } catch (Exception e) {
            return new BigDecimal(A.doubleValue() / B.doubleValue());
        }
    }

    /**
     * Obtiene una lista de objetos de tipo SelectedItem.
     *
     * @return la lista
     */
    @Override
    public List<SelectItem> getSelectedItem() {
//        try {
//            List<CexTurnosEnc> datos = admin.listarOrdenada(object.getClass(), "nombre", true);
//            List<SelectItem> items = new ArrayList<SelectItem>();
//            for (CexTurnosEnc obj : datos) {
//                items.add(new SelectItem(obj, obj.get));
//            }
//            return items;
//        } catch (Exception e) {
//            log.error("getSelectedItem() {} ", e.getMessage());
//        }
        return null;
    }

    public void onRowEdit(RowEditEvent event) {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        try {
            CexAgenda objAgen = (CexAgenda) event.getObject();
            adminObject.modificar(objAgen, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    public boolean isLaser() {
        return laser;
    }

    public void setLaser(boolean laser) {
        this.laser = laser;
    }

    public boolean isOtros() {
        return otros;
    }

    public void setOtros(boolean otros) {
        this.otros = otros;
    }

    public CexTipoTerapia getCexTipoTerapia() {
        return cexTipoTerapia;
    }

    public void setCexTipoTerapia(CexTipoTerapia cexTipoTerapia) {
        this.cexTipoTerapia = cexTipoTerapia;
    }

    public boolean isOndaCorta() {
        return ondaCorta;
    }

    public void setOndaCorta(boolean ondaCorta) {
        this.ondaCorta = ondaCorta;
    }

    public boolean isUltrasonido() {
        return ultrasonido;
    }

    public void setUltrasonido(boolean ultrasonido) {
        this.ultrasonido = ultrasonido;
    }

    public boolean isMagnetoterapia() {
        return magnetoterapia;
    }

    public void setMagnetoterapia(boolean magnetoterapia) {
        this.magnetoterapia = magnetoterapia;
    }

    public boolean isCompresaCaliente() {
        return compresaCaliente;
    }

    public void setCompresaCaliente(boolean compresaCaliente) {
        this.compresaCaliente = compresaCaliente;
    }

    public boolean isCompresaFria() {
        return compresaFria;
    }

    public void setCompresaFria(boolean compresaFria) {
        this.compresaFria = compresaFria;
    }

    public boolean isTanques() {
        return tanques;
    }

    public void setTanques(boolean tanques) {
        this.tanques = tanques;
    }

    public boolean isMasoterapia() {
        return masoterapia;
    }

    public void setMasoterapia(boolean masoterapia) {
        this.masoterapia = masoterapia;
    }

    public boolean isReduccionPostural() {
        return reduccionPostural;
    }

    public void setReduccionPostural(boolean reduccionPostural) {
        this.reduccionPostural = reduccionPostural;
    }

    public boolean isKinesioTerapia() {
        return kinesioTerapia;
    }

    public void setKinesioTerapia(boolean kinesioTerapia) {
        this.kinesioTerapia = kinesioTerapia;
    }

    public boolean isMecanoTerapia() {
        return mecanoTerapia;
    }

    public void setMecanoTerapia(boolean mecanoTerapia) {
        this.mecanoTerapia = mecanoTerapia;
    }

    public boolean isEntrenamientoPre() {
        return entrenamientoPre;
    }

    public void setEntrenamientoPre(boolean entrenamientoPre) {
        this.entrenamientoPre = entrenamientoPre;
    }

    public boolean isEntrenamientoPost() {
        return entrenamientoPost;
    }

    public void setEntrenamientoPost(boolean entrenamientoPost) {
        this.entrenamientoPost = entrenamientoPost;
    }

    public boolean isGimnasio() {
        return gimnasio;
    }

    public void setGimnasio(boolean gimnasio) {
        this.gimnasio = gimnasio;
    }

    public boolean isElectrodos() {
        return electrodos;
    }

    public void setElectrodos(boolean electrodos) {
        this.electrodos = electrodos;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }
}
